Date		:	22 juin 1991
		Protection	:	ECRANS D'ENTREE
		Programme	:       FORMATQM.COM
		Outils		:	SOFT-ICE
		Fichier		:	FORMATQM.COM
		Temps pass�	:	1 HEURE 30.
		Soci�t�		:	SYDEX
		Divers	        :	
		Origine		:	L.F.
		Num�ro		:	101


	FORMATQM est un petit utilitaire efficace et tr�s utile en SHAREWARE
	ce qui veut dire qu'il est de bon ton de verser sa contribution �
	l'auteur du soft. Et pour vous le rappelez le programme insiste
	lourdement � chaque d�marrage avec deux �crans de pr�sentation qui
	� force deviennent p�nibles. De plus ce genre d'affichage est
	g�n�ralement cod� pour d�courager ceux qui auraient mauvaise conscience.
	Et c'est le cas de FORMATQM puisqu'aucune des chaines affich�es �
	l'�cran n'apparait dans le fichier.
	Premier objectif, faire dispara�tre les 4 derni�res lignes lors de
	l'affichage sans param�tres.
	L'affichage �cran est effectu� par l'interm�diaire de l'INT 21 fonction
	40. Cette fonction permet d'�crire � l'aide d'un handle, un nombre 
	d�termin� d'octets dans un fichier ou sur un p�riph�rique. Ces
	caract�res sont tir�s de DS:DX et le nombre � �crire est en CX.
	BX contient le handle, ici il contient 0001, c'est donc sur l'�cran
	que les caract�res seront envoy�s.
	Donc il est simple de soustraire du chargement de CX le nombre de
	caract�res que l'on ne veut pas afficher.
	Le hic c'est que CX est charg� avec FFFF bien avant l'appel de l'INT 21
	et que le programme fait un SCAN de la chaine pour trouver un octet
	�gal � 00, � ce moment CX ne contient plus que FFFF moins le nombre de
	caract�res � afficher soit FD70 que le programme NOTe ce qui donne
	028F dans CX avant l'appel de l'INT 21.
	Je ne peux pas agir apr�s l'instruction SCAN. ( je n'ai pas de place )
	Et on ne peut pas diminuer le contenu de CX � l'initialisation car
	avec le NOT on retrouve alors un r�sultat sup�rieur � afficher.

	0C08:18F2	B9FFFF	MOV	CX,FFFF ; ON CHARGE A FFFF
	0C08:18F5	FC	CLD
	0C08:18F6	32C0	XOR	AL,AL
	0C08:18F8	F2AE	REPNZ	SCASB	; SCAN BYTE 	
	0C08:18FA	F7D1	NOT	CX
	0C08:18FC	8BD3	MOV	DX,BX
	0C08:18FE	BB0100	MOV	BX,0001 ; HANDLE ECRAN DANS BX
	0C08:1901	B440	MOV	AH,40	; FONCTION 40 DE L'INT 21
	0C08:1903	CD21	INT 	21	; APPEL DE L'INT 21

	Apr�s le NOT on trouve dans CX 028F caract�res. Il n'en faudrait que
	01B0 pour ne pas afficher les 4 derni�res lignes. Je me casse la t�te
	un moment car je ne peux pas diminuer CX sans augmenter le r�sultat
	apr�s le NOT et je ne peux pas augmenter CX. ( difficile de faire
	rentrer plus de 65536 dans un registre 16 bits ).
	Mais quelle est l'utilit� de charger CX au maximum puis de faire un
	NOT ? aucune !
	Je supprime le NOT et je charge CX avec le nombre de caract�res qu'il
	SCAN c'est � dire 028F plus 028F caract�res qu'il va afficher moins
	00DF caract�res qu'il ne doit pas afficher.
	En fait: 028F + 01B0 = 043F. Et �a marche ( encore heureux ).
	Mais � ce point l� de mes investigations j'ignorais encore que le
	plus dur restait � venir, car bien �videment cette chaine est cod�e.
	
	Il faut modifier la routine ci-dessus comme suit:

		MOV	CX,043F		; Ne charger qu'avec 34F octets
		CLD
		XOR	AL,AL
		REPNZ	SCANSB
		NOP			; Supprimer le NOT CX
		NOP

	Je laisse tomber pour l'instant et relance le soft avec un param�tre et
	celui-ci m'affiche les fameuses pages pour verser ma d�me � l'auteur.
	Je me mets � la recherche de la routine d'affichage et je la trouve
	dans un CALL que je supprime pour voir, et cel� fonctionne.
	Mais bien s�r il est �galement cod�.
	Je me mets donc � la chasse de la routine de codage qui est sans aucun
	doute la m�me pour mon probl�me pr�c�dent.
	Mon CALL � supprimer se trouve ici:

	0C08:0BFA	E8290D	CALL...
	0C08:0BFD	E8E021	CALL...	; A SUPPRIMER
	0C08:0C00	E8080D	CALL...

	Je place un point d'arr�t sur cette position m�moire en �criture:

	BPM 0C08:0BFD W EQ E8

	Et je me retrouve avec la routine suivante:

	0C08:2EE1	AD	LODSW		   ; load AX avec DS:SI
	0C08:2EE2	D1C8	ROR	AX,1       ; Rotate droit de 1
	0C08:2EE4	35EFDE	XOR	AX,DEEF    ; ou exclusif avec DEEF
	0C08:2EE7	894402	MOV	[SI+02],AX ; on re�crit au m�me endroit
	0C08:2EEA	E2F5	LOOP	2EE1	   ; et on boucle...
	
	Ce n'est pas sorcier il faut d'abord regarder � quoi corespond la 
	chaine avant qu'elle ne soit d�cod�e pour pouvoir la retrouver avec
	PCTOOLS dans le fichier. Pour cel� il suffit de mettre un point d'arr�t
	d'un mot en amont de la chaine � trouver. Dans le cas pr�sent il faut
	placer le point d'arr�t comme suit:

	BPM 0C08:0BC0 W EQ E8

	Et on trouve en DS:SI       		;	0FEE C46D 1FFE
 	Qui donnera une fois d�cod� 		;	E829 0DE8 E021
	Comme je veux supprimer le CALL il faut ;       E829 0D90 9090

	Le programme effectue les op�rations suivantes:

	1- load de AX par DS:SI
	2- Rotate � droite de 1
	3- XOR avec DEEF
	4- r�ecrit en DS:DI  

	ATTENTION: lors d'un chargement d'un registre de la m�moire les octets
	bas et haut sont toujours invers�s ( standart INTEL ) ainsi que lors
	d'un MOV registre vers m�moire. Il faut en tenir compte puisque je vais
	faire les op�rations � l'envers manuellement. ( oui je sais j'ai d�j�
	pens� � automatiser le processus... )

	Donc comme il me faut 0D90 ( premier mot ), on inverse les octets puis
	je reXORe avec DEEF ce qui donne : 900D XOR DEEF = 4EE2.
	Puis on effectue un ROL ( puisque c'�tait un ROR ) ce qui me fait 9DC4
	que je retourne une fois de plus; C49D avant de l'�crire � la place de
	C46D.
	M�me punition pour le deuxi�me mot ce qui donne FE9C � mettre � la place
	de 1FFE pour obtenir 9090.
	
	Je fais un essai, c'est OK.

	Il me reste la chaine du d�but avec mon CX qui est charg� � FFFF.
	Je fais la aussi un BPM en amont pour avoir la chaine brute de fonderie.
	
	On a dans le fichier 	:	AC42 2044 BA3D 3AE0 301E
	Une fois en clair    	:	B9FF FFFC 32C0 F2AE F7D1
	Et il me faut        	:       B93F 04FC 32C0 F2AE 9090

	La m�me op�ration est appliqu�e ce qui donne les mots suivant �
	placer dans le fichier  :       ADC2 D645 .... .... FE9C
           	
	Derni�re minute, je me suis aper�u que dans le cas o� l'on lance le
	soft avec de mauvais param�tres il affiche n'importe quoi, ce qui me
	fait dire que le fait de placer 043F dans CX n'est pas la bonne
	solution, en fait il faut placer un caract�re null avant les quatres
	derni�res lignes pour que le soft ne les affiche pas et laisser la
	routine d'affichage intacte puisque le soft s'en sert pour afficher
	les messages d'erreur.
	Il faut scanner la chaine lorsqu'elle est d�j� en clair et voir o� il
	faut placer un 00 ( null ). Qu'il faudra recoder comme les autres
	caract�res.

	Avec PCTOOLS chercher 317717E1C5A9C5 et remplacer le dernier C5 par
	DF, puis chercher 0FEEC46D1FFE et remplacer 6D1FFE par 9DFE9C.

	FREDDY